package com.vipboot.platform.system.controller.rbac;

import cn.dev33.satoken.annotation.SaCheckPermission;

import com.vipboot.framework.core.domain.R;
import com.vipboot.framework.core.optionselect.OptionSelect;
import com.vipboot.framework.core.validation.AddGroup;
import com.vipboot.framework.core.validation.EditGroup;
import com.vipboot.framework.log.annotation.Log;
import com.vipboot.framework.log.enums.BusinessType;
import com.vipboot.framework.mybatisplus.core.page.PageData;
import com.vipboot.framework.mybatisplus.core.page.PageQuery;
import com.vipboot.platform.system.crud.service.rbac.SysPostService;
import com.vipboot.platform.system.domain.bo.SysPostBo;
import com.vipboot.platform.system.domain.vo.SysPostVo;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;


import java.util.List;

/**
 * <p>
 * 岗位信息表 前端控制器
 * </p>
 *
 * @author daze
 * @since 2024-12-10
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/sysPost")
public class SysPostController {

    private final SysPostService sysPostService;

    /**
     * 分页查询岗位信息表。
     *
     * @param pageQuery 分页对象
     * @return 分页对象
     */
    @SaCheckPermission("sysPost:list")
    @GetMapping("/page")
    public R<PageData<SysPostVo>> page(@ModelAttribute SysPostBo bo,
                                       @ModelAttribute PageQuery pageQuery) {
        return R.ok(sysPostService.page(bo, pageQuery));
    }

    /**
     * 添加岗位信息表。
     *
     * @param bo 岗位信息表
     */
    @SaCheckPermission("sysPost:save")
    @Log(module = "岗位管理", title = "添加岗位", businessType = BusinessType.Insert)
    @PostMapping("/save")
    public R<Void> save(@Validated(AddGroup.class)
                        @RequestBody SysPostBo bo) {
        return sysPostService.save(bo) ? R.ok() : R.fail();
    }


    /**
     * 根据主键更新岗位信息表。
     *
     * @param bo 岗位信息表
     */
    @SaCheckPermission("sysPost:update")
    @Log(module = "岗位管理", title = "更新岗位", businessType = BusinessType.Update)
    @PostMapping("/update")
    public R<Void> update(@Validated(EditGroup.class)
                          @RequestBody SysPostBo bo) {
        return sysPostService.update(bo) ? R.ok() : R.fail();
    }


    /**
     * 根据主键删除岗位信息表。
     *
     * @param id 主键
     */
    @SaCheckPermission("sysPost:remove")
    @Log(module = "岗位管理", title = "删除岗位", businessType = BusinessType.Delete)
    @PostMapping("/remove/{id}")
    public R<Void> remove(@NotNull(message = "主键不能为空")
                          @PathVariable Long id) {
        return sysPostService.removeById(id) ? R.ok() : R.fail();
    }

    /**
     * 根据部门ID 获取岗位选择框列表
     **/
    @GetMapping("/listOptionSelect")
    public R<List<OptionSelect<Long>>> listOptionSelect(@RequestParam(required = false) Long deptId) {
        return R.ok(sysPostService.listOptionSelectByDeptId(deptId));
    }

}
